package ch5;

import java.util.Scanner;

public class HWExer {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        /*1：输入一个整数，判断其是否是另一个数的平方，比如64是8的平方，7不是任何数的平方 */
        System.out.println("请输入一个数：");
        int num = scan.nextInt();
        int sqrt = (int)Math.sqrt(num);
        boolean isFalg = true;
        for( int i = 1;i <= sqrt;i++){
            if(i * i == num) {
                System.out.println(num + "是" + i + "的平方");
                isFalg = false;
                break;
            }
        }
        if(isFalg){
            System.out.println(num + "不是任何数的平方");
        }

        /*练习2：将一个正整数分解质因数。例如：输入90,打印出90=2*3*3*5。*///15=3*5  //24=2*2*2*3//
        // (15 3.4)(20 4.5)(9 3.3)(16 4.4)(25 5.5)(81 9.9)(16 = 2*2*2*2)(20=2*2*5)
        System.out.println("请输入一个正整数：");//(百度)
        int num4 = scan.nextInt();
        System.out.print(num4+" =");
        for (int i = 2; i <= num4; i++) {
            while (num4 != i) {
                if (num4 % i == 0) {
                    System.out.print(i + "*");
                    num4 /= i;
                } else {
                    break;
                }
            }
        }
        System.out.print(num4);
       /* System.out.println("请输入一个正整数：");
        int num1 =scan.nextInt();
        int k = 1;
        if(num1 % 2 ==0){
            num1 /= 2;
            k *= k;

        }else{

        }*/

        /*练习3： *一个整数，它加上100后是一个完全平方数，再加上168又是一个完全平方数，请问该数是多少？ */
        System.out.println("*****************");
        for(int x =0;x<10000;x++){
            int i =(int) Math.sqrt(x+100);
            int y =(int) Math.sqrt(x+268);
            if(i * i== (x+100) &&(y*y==(x+268))){
                System.out.println(x);
                break;//这里只求了第一个符合条件的数
            }
        }
        /*练习4：输出比10000大的10个质数*/
        boolean isFlage = true;
        int account = 0;
        for(int i = 10000;i <= 100000;i++){
            for(int j = 2;j <= Math.sqrt(i);j++){
                if(i % j == 0){
                    isFlage = false;
                    break;
                }
            }
            if(isFlage){
                    account++;
                    if(account <=10){
                    System.out.println(i);
                    }
                }
            isFlage = true;
        }

        /* 练习5：如果斐波拉切数列的前N项，N由用户输入。
        斐波拉切数列的定义是前两个是1，后面的每一个是前面的两个和//1 1 2 3 5 8 13
        比如N是5,则输出结果是1,1,2,3,5*///f(n)=f(n-1)+f(n-2)
        System.out.println("请输入所确定的斐波那契数列的项数：");//（参考网上）
        int many = scan.nextInt();
        int[] arr = new int[many];
        arr[0] = 1;
        if(many==1){
            System.out.println(arr[0]);
        }
        if(many == 2){
            arr[0] = 1;
            arr[1] = 1;
            for(int i = 0;i < many;i++){
                System.out.print(arr[i] +" ");
            }
        }else{
            arr[0] = 1;
            arr[1] = 1;
            for(int j =0;j<many;j++) {
                for (int i = 3; i <= arr.length; i++) {
                    arr[i - 1] = arr[i - 2] + arr[i - 3];
                }
                System.out.print(arr[j] + " ");
            }
        }
        /*System.out.println("请输入所确定的斐波那契数列的项数：");
        int many = scan.nextInt();
        int a;
       for(int i=0,j=1;(i<=many)&&(j<=many);i=j,j=a){
           a = i+j;
           System.out.print( a + " ");
       }*/



        /*练习6:输入一个整数，判断其是否是回文数，回文数是指这个数颠倒后，和原数相同那个。*/
        System.out.println("请输入一个整数：");
        int huiWen = scan.nextInt();
        int b = huiWen;
        int hNumber = 0;
        while(huiWen >0){
            int a = huiWen % 10;
            hNumber = hNumber*10 + a;
            huiWen /= 10;
        }
        if(hNumber == b){
            System.out.println(b + "是回文数");
        }else {
            System.out.println(b + "不是回文数");
        }

        /*练习7：输出1-10000以内所有的质数并统计个数*/
        boolean isFal = true;
        int account2 = 0;
        for(int i = 2;i <=10000;i++){
            for(int j = 2;j <= Math.sqrt(i) ;j++){
                if(i % j == 0){
                    isFal = false;
                    break;
                }
            }
            if(isFal){
                account2++;
                System.out.println("第" + account2 + "个质数为："+ i);
            }
            isFal = true;
        }

        /*练习8：*：现在纸币面额有 1元，2元，5元，10元，20元，50元和100元，
        输入一个正整数的金额，输出所有的组成可能，比如输入 3元，则有  3个1元 和  一个2+1个1元两种可能*/
        int account3=0;
        System.out.println("请输入一个数：");
        int num3 =scan.nextInt();
        for(int x =0;x <= num3 ;x++){
            for(int y = 0;y<((num3 / 2)+1);y++){
                for (int z=0;z<((num3/5)+1);z++){
                    for(int a = 0;a<((num3 /10)+1);a++){
                        for(int b2 =0;b2 < ((num3 /20)+1);b2++){
                            for(int c=0;c<((num3/50)+1);c++){
                                for(int d=0;d<((num3 / 100)+1);d++){
                                    if(x+2*y+5*z+10*a+20*b+50*c+100*d == num3){
                                        account3++;
                                        System.out.println("x="+x+",y="+y+",z="+z+"a="+ a +",b2="+ b2+",c="+c+",d="+d);
                                        //break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        System.out.println("一共有"+ account3+"种方法");

        /*练习9*：计算公式1+1/2^2+1/3^2+1/4^2..+1/n^2的和
        其中n^2表示n的平方。算到每一项的和小于百万分之一即可。。。*/
        double sum2 = 0.0;
        double mutiply = 1.0;
        for (int i = 1; i <=7; i++) {
            mutiply *= (1 + 0.0) / (i * i);
            sum2 += (1.0) / (i * i);
            if (mutiply < (1.0 / 1000000)) {
                System.out.println(sum2);
                break;
            }
        }


    }
}
